home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Explosion
/
Software Explosion (Fore-Matt Home Computing)(1996).iso
/
games
/
workbench
/
snake
/
snake.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-01-01
|
4KB
|
264 lines
/*
* snake.c - a simple Amiga game
*
* Bruno Costa - 30 apr 89
*
*/
#include <exec/types.h>
#include <intuition/intuition.h>
#include <functions.h>
int retcode = 0;
struct Library *IntuitionBase = NULL;
struct Library *GfxBase = NULL;
struct Window *wd = NULL;
struct RastPort *rp = NULL;
#define XSIZE 140
#define YSIZE 88
#define XPIX 3
#define YPIX 2
#define NPOINTS 50
#define MAXLEN 120
#define GROWTHSPEED 7
#define DOTCOL 2
#define SNKCOL 1
#define AIMCOL 3
#define BKGCOL 0
struct NewWindow wdattr = {
0, 11, XPIX*XSIZE + 8, YPIX*YSIZE + 13,
2, 1, CLOSEWINDOW,
WINDOWDEPTH | WINDOWDRAG | WINDOWCLOSE | GIMMEZEROZERO |
SMART_REFRESH | ACTIVATE | NOCAREREFRESH,
NULL, NULL, NULL, NULL, NULL,
0, 0, 0, 0,
WBENCHSCREEN
};
struct {int x, y;} sn[MAXLEN];
int snhead, sntail, sndir, snlen;
int sndx[4] = {-1, 0, 1, 0 };
int sndy[4] = { 0,-1, 0, 1 };
int score;
#define random(max) (rand()%max)
Abort(code)
int code;
{
if (wd)
CloseWindow(wd);
if (IntuitionBase)
CloseLibrary(IntuitionBase);
if (GfxBase)
CloseLibrary(GfxBase);
exit (code);
}
setdisplay()
{
GfxBase = OpenLibrary("graphics.library",0L);
IntuitionBase = OpenLibrary("intuition.library",0L);
wd = OpenWindow(&wdattr);
if (!wd)
Abort(30);
rp = wd->RPort;
}
plot (x,y,c)
int x,y,c;
{
register int i, yc;
int xi, xf;
xi = x * XPIX;
xf = xi + XPIX - 1;
yc = y * YPIX;
SetAPen (rp, (long)c);
for (i = 0; i < YPIX; yc++, i++)
{
Move (rp, (long)xi, (long)yc);
Draw (rp, (long)xf, (long)yc);
}
}
int rdpix(x,y)
int x,y;
{
return (ReadPixel(rp, (long)(x * XPIX), (long)(y * YPIX)));
}
int plotaim()
{
int x, y;
do
{
x = random(XSIZE);
y = random(YSIZE);
} while (rdpix(x, y) != BKGCOL);
plot(x, y, AIMCOL);
}
dispscore()
{
char str[20];
sprintf(str, " Score: %d ", score);
SetWindowTitles(wd, str, "Snake v 1.0 - \xa9 1989 Bruno Costa");
}
initscreen()
{
int i;
SetRast(rp,(long)BKGCOL);
for (i = 0; i < XSIZE; i++)
{
plot (i, 0, DOTCOL);
plot (i, YSIZE-1, DOTCOL);
}
for (i = 0; i < YSIZE; i++)
{
plot (0, i, DOTCOL);
plot (XSIZE-1, i, DOTCOL);
}
for (i = 0; i < NPOINTS; i++)
plot (random(XSIZE),random(YSIZE),DOTCOL);
}
initsnake()
{
snhead = sntail = sndir = 0;
snlen = 1;
sn[0].x = XSIZE/2;
sn[0].y = YSIZE/2;
plot (sn[0].x, sn[0].y, SNKCOL);
}
/* joystick reading routines */
#define JPORT 2
#define JOYADDR (short *)(0xdff008 + 2 * JPORT)
#define CIAADDR (char *)(0xbfe001)
int fire()
{
return (!(*CIAADDR & (64 * JPORT)));
}
int joydx()
{
int t = *JOYADDR;
if (t & 2)
return 1;
if (t & 512)
return -1;
return 0;
}
int joydy()
{
int t = *JOYADDR >> 1 ^ *JOYADDR;
if (t & 1)
return 1;
if (t & 256)
return -1;
return 0;
}
int testbreak()
{
struct Message *msg;
if (msg = GetMsg(wd->UserPort))
{
ReplyMsg(msg);
return (1);
}
else
return (0);
}
waitbutton()
{
while(!fire())
{
Delay(10L);
if (testbreak())
Abort(1);
}
}
play()
{
int cx, cy;
int time = 0;
score = 0;
dispscore();
initsnake();
plotaim();
cx = sn[snhead].x;
cy = sn[snhead].y;
for (;;)
{
if (joydx() || joydy()) /* true if joystick moved */
{
int dx = joydx();
int dy = joydy();
if (!(dx && dy)) /* diagonals are discarded */
if (dx != -sndx[sndir] || dy != -sndy[sndir])
if (dx == 1) sndir = 2;
else if (dx == -1) sndir = 0;
else if (dy == 1) sndir = 3;
else sndir = 1;
}
cx += sndx[sndir];
cy += sndy[sndir];
if (rdpix(cx,cy)) /* true if collision happened */
{
if (rdpix(cx,cy) == AIMCOL)
{
score++;
dispscore();
plotaim();
}
else
return;
}
plot (cx, cy, SNKCOL);
snhead = (snhead + 1) % MAXLEN;
if (snlen < MAXLEN && !(time % GROWTHSPEED))
snlen++;
else
{
plot (sn[sntail].x, sn[sntail].y, BKGCOL);
sntail = (sntail + 1) % MAXLEN;
}
sn[snhead].x = cx;
sn[snhead].y = cy;
if (testbreak())
Abort(1);
Delay(1L);
time++;
}
}
main()
{
setdisplay();
for (;;)
{
initscreen();
play();
dispscore();
waitbutton();
}
}